#ifndef _ENGINE_H_
#define _ENGINE_H_

#include <stdio.h>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <map>
#include <vector>

#include "glad/glad.h"
#include <GLFW/glfw3.h>

#include <glm.hpp>
#include <gtc/matrix_transform.hpp>
#include <gtc/type_ptr.hpp>

#include "log/log.h"

#define ENGINE_DEBUG(...) Log::GetLogger()->debug(##__VA_ARGS__)
#define ENGINE_INFO(...) Log::GetLogger()->info(##__VA_ARGS__)
#define ENGINE_WARNING(...) Log::GetLogger()->warn(##__VA_ARGS__)
#define ENGINE_ERROR(...) Log::GetLogger()->error(##__VA_ARGS__)

#ifdef ENGINE_ENABLE_ASSERT
#define ENGINE_ASSERT(x, ...)                                    \
    do                                                           \
    {                                                            \
        if (!(x))                                                \
        {                                                        \
            ENGINE_ERROR("Assertion Failed!: {0}", __VA_ARGS__); \
        }                                                        \
    } while (0)
#else
#define ENGINE_ASSERT(x, ...)
#endif

#endif